package model;

import com.sun.scenario.effect.impl.sw.java.JSWBlend_SRC_OUTPeer;

/**
 * @author Xu,
 * @date 2020/11/10
 * 生命游戏
 */
public class SimpleGoL {
    /**
     * 二维世界的长与宽,从.txt文件中获取,都等于size
     */
    private int size;
    private int[][] map = new int[size][size];
    /**
     * 生命周期
     */
    private int day;

    /**
     * 构造方法
     * @param size
     * @param day
     * @param map
     */
    public SimpleGoL(int size, int day, int[][] map){
        this.size = size;
        this.day = day;
        this.map = map;
    }

    /**
     * 一个生命周期的转变
     * 周围存活细胞数为3，下一状态该细胞总是为活
     * 周围存活细胞数为2，下一状态与上一状态相同
     * V2.0并行化
     * 将棋盘拆分为左右两块，参数决定线程执行哪边
     */
    public void transform(int x1,int width){
        int[][] newMap = new int[size][size];
        for(int x=x1; x<width; x++){
            for(int y=0; y<size; y++){
                newMap[x][y] = 0;
                int nearNum = livedNum(x,y);
                //等于3，下一状态为活
                if(nearNum == 3){
                    newMap[x][y] = 1;
                }
                //等于2，与上一状态一致
                else if(nearNum == 2){
                    newMap[x][y] = map[x][y];
                }
            }
        }
        //map合并
        for(int y=0; y<size; y++) {
            for (int x = x1; x < width; x++) {
                map[x][y] = newMap[x][y];
            }
        }
    }

    /**
     * 统计每个细胞周围存活细胞个数
     * @param x 横
     * @param y 纵
     * @return
     * 边界细胞查找时不能越界！
     */
    public int livedNum(int x, int y) {
        int num = 0;
        //左
        if(x != 0){
            num += map[x-1][y];
        }
        //左上
        if(x != 0 && y != 0){
            num += map[x-1][y-1];
        }
        //上
        if(y != 0){
            num += map[x][y-1];
        }
        //右上
        if(x != size-1 && y != 0){
            num += map[x+1][y-1];
        }
        //右
        if(x != size-1){
            num += map[x+1][y];
        }
        //右下
        if(x != size-1 && y != size-1){
            num += map[x+1][y+1];
        }
        //下
        if(y != size-1){
            num += map[x][y+1];
        }
        //左下
        if(x != 0 && y != size-1){
            num += map[x-1][y+1];
        }
        return num;
    }

    /**
     * getter and setter
     */
    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    public int[][] getMap() {
        return map;
    }

    public void setMap(int[][] map) {
        this.map = map;
    }

    public int getDay() {
        return day;
    }

    public void setDay(int day) {
        this.day = day;
    }
}
